package com.dhj.jvmstudy.chapter07;

/**
 * 如何保证变量s指向的是字符串常量池中的数据呢？
 * 有两种方式：
 * 方式一：
 * String s = "DaHuaJia";   //字面量定义方式
 * 方式二：调用intern()方法
 * String s = new String("DaHuaJia").intern();
 * String s = new StringBuilder("DaHuaJia").toString().intern();
 */
public class StringIntern {

    public static void main(String[] args) {
        String s = new String("1");
        s.intern();
        String s2 = "1";
        System.out.println(s == s2);    //jdk6:false   jdk7/8:false

        // =========================================================================================

        String s3 = new String("1") + new String("1");
        // 执行完上一行代码以后，字符串常量池中，是否存在"11“呢？答案：不存在！！
        s3.intern();    // 在字符串常量池中生成"11" 如何理解：jdk6：创建了一个新的对象"11"，也就有新的地址。
                                                //       jdk7：此时常量中并没有创建"11"，而是创建一个指向雄空间中new String(“11")的地址
        String s4="11"; // s4变量记录的地址：使用的是上一行代码代码执行时，在常量池中生成的"11"的地址
        System.out.println(s3 == s4);   //jdk6:false   jdk7/8:true
    }

    /**
     * 如何理解在jdk8下，前为false，后为true
     * 猜测：
     * 前部分是在编译期就已经确定的。后部分由于有变量存在，所以无法在编译期确定。
     */

}
